package com.fg.cloud.common.file;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileUtils extends org.apache.commons.io.FileUtils{
	private final static Logger logger = LoggerFactory.getLogger(FileUtils.class);
	public static final String FILE_SEPARATOR = "/";

	/**
	 * 保存文件
	 * 
	 * @param stream
	 * @param fileName
	 * @param fileContentType
	 * @return
	 */
	public static String saveFile(InputStream stream, String saveImageDir, String fileName, String fileContentType) {
		FileOutputStream fos = null;
		try {
			DateTime dateTime = new DateTime();
			String realPath = FileUtils.getFileName(saveImageDir, fileName, String.valueOf(dateTime.getYear()),
					String.valueOf(dateTime.getMonthOfYear()));
			fos = new FileOutputStream(realPath);
			IOUtils.copyLarge(stream, fos);
			return changeToWebRoot(realPath, saveImageDir);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			try {
				org.apache.commons.io.IOUtils.closeQuietly(fos);
				org.apache.commons.io.IOUtils.closeQuietly(stream);
			} catch (Exception e) {
				logger.error("close stream fail", e);
			}
		}
	}

	public static String getFileName(String savedFilePath, String proFileName, String... fileDirs) {
		return getFileDir(savedFilePath, fileDirs) + getRandomFileName(proFileName);
	}

	/**
	 * 获取随机数"
	 * 
	 * @param proFileName
	 * @return
	 */
	public static String getRandomFileName(String proFileName) {
		int length = proFileName.lastIndexOf(".");
		if (length == -1) {
			return UUID.randomUUID().toString();
		}
		String suffix = proFileName.substring(length);
		return UUID.randomUUID().toString() + suffix;
	}

	/**
	 * 请fileDirs不要为空
	 * 
	 * @param fileDirs
	 * @return
	 */
	public static String getFileDir(final String imageDir, String... fileDirs) {
		String dir = imageDir;
		for (String fileDir : fileDirs) {
			dir = dir + FILE_SEPARATOR + fileDir;
		}
		dir += FILE_SEPARATOR;
		File file = new File(dir);
		if (!file.exists()) {
			file.mkdirs();
		}
		return dir;
	}

	/**
	 * 修改地址
	 * 
	 * @param sourceDir
	 * @param imgRoot
	 * @return
	 */
	public static String changeToWebRoot(String sourceDir, String imgRoot) {
		int index = sourceDir.indexOf(imgRoot) + imgRoot.length();
		return sourceDir.substring(index).replace(System.getProperty("file.separator"), "/");
	}

	static boolean flag;
	static File file;
	/**
	 * 删除单个文件
	 * @param sPath 被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	public static boolean deleteFile(String sPath) {
		flag = false;
		file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			file.delete();
			flag = true;
		}
		return flag;
	}
	
	
	/**
	 * 用于检测File：1、是否是文件；2、是否存在该文件；
	 * @param file
	 * @return boolean
	 */
	public static boolean checkFile(File file) {
		boolean flag = true;
		
		if(!file.exists()) flag = false;
		if(!file.isFile()) flag = false;
		
		return flag;
	}
	
	/**
	 * 删除指定文件
	 * @param file
	 */
	public static void remove(File file) {
		if(checkFile(file)) file.delete();
	}
	
	public static void remove(String filePath) {
		if(StringUtils.isNotEmpty(filePath)) {
			File file = new File(filePath);
			if(checkFile(file)) {
				file.delete();
			}
		}	
	}
	
	/**
	 * 检测目录是否存在，是否是目录
	 * @param dir 
	 * @return boolean
	 */
	public static boolean checkDir(File dir) {
		boolean flag = true;
		
		if(!dir.exists()) flag = false;
		if(!dir.isDirectory()) flag = false;
		
		return flag;
	}
	
	/**
	 * 清除当前目录下的所有目录中的文件，包含目录和文件 -- 递归
	 * @param file
	 */
	public static void clearDirectory(File file) {
		//判断是否是目录
		if(checkDir(file)) {
			for(File temp : file.listFiles()) {
				if(checkDir(temp)) clearDirectory(temp);
				else temp.delete();
			}
		}
	}
	
	/**
	 * 清除当前目录下的所有文件
	 * @param file
	 */
	public static void clearDir(File file) {
		//判断是否是目录
		if(checkDir(file)) {
			for(File temp : file.listFiles()) {
				temp.delete();
			}
		}
	}
	
	/**
	 * 根据路径找到最子级
	 * @param dirName
	 * @return
	 */
	public static File getFile(String ... dirName) {
		if(dirName == null) throw new NullPointerException("dirName must not be null");
		
		File file = null;
		for(String name : dirName) {
			if (file == null)
				file = new File(name);
			else {
				file = new File(file, name);
			}
		}
		return file;
	}
	
	/**
	 * 封装File对象集合
	 * @param fileNames
	 * @return List<File>
	 */
	public static List<File> getFiles(String[] fileNames) {
		List<File> fileList = new ArrayList<File>();
		File file = null;
		for (int i = 0; i < fileNames.length; i++) {
			file = new File(fileNames[i]);
			fileList.add(file);
		}
		return fileList;
	}
	
}
